package com.thread.interrupt;

/**
 * <p>
 * waiting/timed_waiting
 *
 * 线程调用如下方法会进入waiting状态
 *      join()
 *      wait()
 *
 * 线程调用如下方法会进入timed_waiting状态
 *      join(long timeout)
 *      wait(long mills)
 *      sleep(long mills)
 *
 *          以上的五个方法均可能会抛出interruptException（demo1中就出现了该异常）
 *
 *
 * </p>
 *
 * @author qingshan
 * @since 2020-09-22 09:16
 */
public class WaitingDemo2 {

    public static void main(String[] args) {
        Thread t = new Thread (){
            @Override
            public void run() {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    System.out.println(isInterrupted());
                }
            }
        };
        t.start();
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
        }
        t.interrupt();
    }
}

/**
 * 在上述状态中设置中断，会抛出中断异常，该异常应当及时处理掉不应该直接忽略；处理该异常的两种方式
 *      方式一：向上传递该异常，这使得该方法也变成了一个可中断的方法，需要调用者进行处理
 *      方式二: 有些情况，不能向上传递异常，比如Thread的run方法，它的声明是固定的，不能抛出任何受检异常，
 *          这时，应该捕获异常，进行合适的清理操作，清理后，一般应该调用Thread的interrupt方法设置中断标志位，
 *          使得其他代码有办法知道它发生了中断
 */

// 方式一：
class HandleInterruptExceptionDemo{

    public void interruptedMethod() throws InterruptedException {
        // ... 包含wait, join 或 sleep 方法
        Thread.sleep(1000);
    }

}

// 方式二
class HandleInterruptExceptionDemo2 extends Thread{
    @Override
    public void run() {
        int i = 0;
        while (!Thread.currentThread().isInterrupted()) {
            try {
                // 模拟任务代码
                Thread.sleep(2000);
                System.out.println("sleep :" + i++);
            } catch (InterruptedException e) {
                // ... 清理操作
                // 重设中断标志位
                Thread.currentThread().interrupt();
                System.out.println("catch sleep interrupted :" + i++);
            }
        }
        System.out.println(isInterrupted());
    }

    public static void main(String[] args) {
        HandleInterruptExceptionDemo2 thread = new HandleInterruptExceptionDemo2();
        thread.start();
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
        }
        thread.interrupt();
    }
}
